﻿Option Strict On
Option Explicit On 

''' -----------------------------------------------------------------------------
''' Project	 : IPUserService
''' Class	 : Core.IPUserService.CBusinessProcessLock
''' 
''' -----------------------------------------------------------------------------
''' <summary>
'''  Nhiệm vụ: làm các business process lock. ví  dụ : 
''' <list type="bullet">
''' <item> lock quản lý danh mục tiền tệ </item>
''' <item> lock quản lý user </item>
''' <item> lock tổng hợp báo cáo tình hinh đầu tư </item>
''' <item> đảm bảo cho 1 lần chỉ có 1 người sử dụng được </item>
''' </list>
''' </summary>
''' <example>
''' Ví dụ khi sử dụng để chỉ cho 1 người sử dụng chức năng phân quyền hệ thống.
''' Trước khi mở form.
''' <code>
''' Public Sub display_phan_quyen_he_thong()
'''    Try
'''        ' ta định nghĩa 1 member là cái Lock này và thử xem có lock được không
'''        m_bplock = New CBusinessProcessLock 
'''        m_bplock.getLock(C_PROCESS_LOCK)
'''        Me.Show()
'''    Catch v_e As Exception
'''        CSystemLog_301.ExceptionHandle(v_e)
'''    End Try
''' End Sub
''' </code>
''' Khi đóng form ta nhả lock ra. Người khác lại dùng được chức năng này.
''' <code>
''' Protected Overrides Sub OnClosed(ByVal e As System.EventArgs)
'''    Try
'''        m_bplock.releaseLock()
'''    Catch ex As Exception
'''        CSystemLog_301.ExceptionHandle(ex)
'''    End Try
''' End Sub
''' </code>
''' </example>
''' <remarks>
''' Có thể sử dụng ở rất nhiều trường hợp  khác nhau. Chú ý là tên khóa có thể tạo tự động ví dụ như pseudo-code sau
''' <code>
'''   
''' m_lock_hop_dong = 1000
''' 
''' 
''' </code>
''' </remarks>
''' <history>
''' 	[csung]	2/22/2005	Created
''' </history>
''' -----------------------------------------------------------------------------
Public Class CBusinessProcessLock

#Region "MEMBERS"
    Private m_us_object As New US_Object
    Private m_str_lock_name As String
    Private m_b_is_having_lock As Boolean = False
#End Region

#Region "PUBLIC"

    ''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' Lấy môt Lock
    ''' </summary>
    ''' <param name="i_str_lock_name">Tên của Lock</param>
    ''' <remarks>
    ''' Nếu không lấy được lock thì sẽ ném ra 1 exception. Giống hệt như LockTimeOut từ Database.
    ''' </remarks>
    ''' <history>
    ''' 	[csung]	2/23/2005	Created
    ''' </history>
    ''' -----------------------------------------------------------------------------
    Public Sub getLock(ByVal i_str_lock_name As String)
        m_us_object.open_connection()
        Dim v_proc As New CStoredProc("db_utils_p.get_lock")
        v_proc.addVarcharInputParam("ip_lock_name", i_str_lock_name)
        v_proc.ExecuteCommand(m_us_object)
        m_b_is_having_lock = True
    End Sub

    ''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' Nhả lock ra. Phải được implement
    ''' </summary>
    ''' <remarks>
    ''' </remarks>
    ''' <history>
    ''' 	[csung]	2/23/2005	Created
    ''' </history>
    ''' -----------------------------------------------------------------------------
    Public Sub releaseLock()
        If m_b_is_having_lock Then
            m_us_object.commit_close_connection()
            m_b_is_having_lock = False
        End If
    End Sub

    ''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks>
    ''' </remarks>
    ''' <history>
    ''' 	[csung]	3/22/2005	Created
    ''' </history>
    ''' -----------------------------------------------------------------------------
    Public Function is_having_lock() As Boolean
        Return m_b_is_having_lock
    End Function
#End Region
End Class
